package com.ustb.controller;

import com.ustb.service.CameraCaptureService;
import org.bytedeco.opencv.opencv_core.Mat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Base64;

/**
 * 相机捕获控制器
 */
@RestController
public class CameraCaptureController {

    @Autowired
    private CameraCaptureService cameraCaptureService;

    @PostMapping("/capture")
    public ResponseEntity<String> captureFrames() {
        try {
            // 调用注入的 cameraCaptureService 的 captureFrames 方法来捕获摄像头的帧
            // 返回的结果是一个Mat类型的数据结构
            Mat mat = cameraCaptureService.captureFrames();

            // 根据Mat的行数、列数以及元素大小来计算需要的字节数组大小
            // 创建一个足够容纳图像数据的字节数组 frameBytes
            byte[] frameBytes = new byte[(int) (mat.rows() * mat.cols() * mat.elemSize())];

            // 将Mat中的图像数据读取到刚刚创建的字节数组 frameBytes 中
            mat.data().get(frameBytes);

            // 使用Base64编码器将字节数组 frameBytes 进行Base64编码
            // 得到一个Base64编码的字符串 base64Encoded
            String base64Encoded = Base64.getEncoder().encodeToString(frameBytes);

            // 创建一个ResponseEntity对象，用于构建完整的HTTP响应信息
            // 设置状态码为HttpStatus.OK，表示请求成功
            // 设置内容类型为MediaType.TEXT_PLAIN，表示返回的是纯文本内容（这里是Base64编码的字符串）
            // 将编码后的字符串 base64Encoded 作为响应体放入ResponseEntity中并返回
            return ResponseEntity.status(HttpStatus.OK).contentType(MediaType.TEXT_PLAIN).body(base64Encoded);
        } catch (Exception e) {
            e.printStackTrace();

            // 创建一个新的ResponseEntity对象，设置状态码为HttpStatus.INTERNAL_SERVER_ERROR
            // 表示服务器内部出现错误
            // 将包含错误信息的字符串（"捕获帧失败: " + e.getMessage()）作为响应体放入ResponseEntity中并返回
            return new ResponseEntity<>("捕获帧失败: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}